# -*- coding: utf-8 -*-
#关于时间
import time
#关于加密
import base64
from Crypto.Cipher import AES
# from Crypto import Random
# print(Random.get_random_bytes(16)) 生成随机二进制

def Encrypt(instr:str, key='0`', iv='0'):
    """
    :param instr: 需要加密的str
    :param key: 加密秘钥(16位）默认有参
    :param iv: 偏移量(16位）默认有参
    :return: str
    """
    try:
        def _pad(s):
            BS = AES.block_size
            s = s.encode("utf-8")
            return s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode("utf-8")
        mystr = _pad(instr)
        cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        ret = base64.b64encode(cipher.encrypt(mystr))
        return str(ret, 'utf-8')
    except:
        return None

def Decrypt(encryptedData:str, key='0`', iv='0'):
    """
    :param encryptedData: 需要解密的str
    :param key: 加密秘钥(16位）
    :param iv: 偏移量(16位）
    :return: str
    """
    try:
        def _unpad(s):
            return s[:-ord(s[len(s)-1:])]

        encryptedData = base64.b64decode(encryptedData)
        cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        ret = _unpad(cipher.decrypt(encryptedData))
        return ret.decode('utf-8')
    except:
        return None

def Time_Standard():
    # 返回标椎的时间格式 %Y-%m-%d %H:%M:%S"
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))

def Lunar_Calendar_day():
    #获取农历时间
    # 例 返回('357', 2022)
    # 第一个是农历一年中的天数（这里转换是按照公历365天来算），
    # 第二个就是农历多少年
    from zhdate import ZhDate
    from datetime import datetime
    try:
        DataYmd = int(time.strftime("%Y", time.localtime())), int(
            time.strftime("%m", time.localtime())), int(time.strftime("%d", time.localtime()))
        DataYmd = ZhDate.from_datetime(datetime(*DataYmd))
        DataYmd = str(DataYmd).strip('农历').strip('日').replace("年", "-").replace("月", "-").split('-')
        DataYmd = DataYmd + time.strftime("%H:%M:%S", time.localtime()).split(':')
        for i in range(6):
            DataYmd[i] = int(DataYmd[i])
        return datetime.date(datetime(*DataYmd)).strftime('%j'), DataYmd[0] #当前355-> 最多365 , 2022
    except:
        return 0

def User_Agents_Is(ua_string:str) -> str:
    """
    :param ua_string: 请传入用户请求头中的User_Agent 字符串
    :return: 设备类型 如Windows 安卓
    """
    # 关于解析用户请求参数
    import user_agents
    try:
        if ua_string == '' and ua_string is None:
            raise
        if len(ua_string) > 18:
            #设备类型 如Windows 安卓
            conf_type = user_agents.parse(ua_string).os.family
            return conf_type
    except:
        pass

def User_ID_IS(string:str):
    """
    :param string: 传入访问者的本地ip地址
    :return: 成功返回他本身， 否则None
    """
    try:
        string = string.split('.')
        if len(string) == 4:
            return '.'.join(string)
        return None
    except:
        return None

def Email_Smtp(to_addr, Text, title='来自qyin.top'):
    """
    :param to_addr: 被发送的邮箱号
    :param Text: 发送内容
    :param title: 发送主体标题, 默认 来自qyin.top
    :return: 失败返回None 成功True
    """
    # 关于邮箱
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    try:
        # 发信方的信息：发信邮箱，QQ
        from_addr = 'qianyin_qyin@foxmail.com'
        # 邮箱授权码
        password = "osdwacwtiwdqdigd"
        # 发信服务器
        smtp_server = "smtp.qq.com"
        # 邮箱正文内容，第一个参数为内容，第二个参数为格式(plain 为纯文本)，第三个参数为编码
        msg = MIMEText(Text, 'plain', 'utf-8')
        # 邮件头信息
        msg['From'] = Header('<{}>'.format(from_addr))
            # Header(from_name+'<'+from_addr+'>')
        msg['To'] = Header(to_addr)
        msg['Subject'] = Header(title)
        # 开启发信服务，这里使用的是加密传输
        server = smtplib.SMTP_SSL(smtp_server)
        server.connect(smtp_server, 465)
        # 登录发信邮箱
        server.login(from_addr, password)
        # 执行发信邮箱
        server.sendmail(from_addr, to_addr, msg.as_string())
        server.quit()  # 关闭服务器
        return True
    except:
        return None
# print(Email_Smtp('mjputmmsc@laste.ml', 'Text'))
# print(Email_Smtp('2486380377@qq.com', 'Text'))

def free_msg():
    """
    使用twillio模块免费发送短信
    """
    from twilio.rest import Client

    # 官网复制的两串key （记得替换成自己的）
    ACCOUNT_SID = "******************c1"
    AUTO_TOKEN = "************"
    # 发送方
    # ＃　注意要替换为（334)319-8454这种格式作为发送方
    FROM_NUM = '网站给你的号码'
    # 接收方
    # 如果要发给你刚才注册时验证以外的电话号，需要进入下方网站进行验证
    # 验证网址：https://www.twilio.com/console/phone-numbers/verified
    TO_NUM = '+86******'


    def send_sms(account_sid, auth_token, from_man, to_man, msg):
        try:
            client = Client(account_sid, auth_token)
            message = client.messages.create(
                to=to_man,
                from_=from_man,
                body=msg)
            if not message:
                return None
        except Exception as e:
            return None
        print(message)
        return message.sid

    # 调用函数
    sms_id = send_sms(ACCOUNT_SID, AUTO_TOKEN, FROM_NUM, TO_NUM, '这里是你要发送短信的信息')
    print(sms_id)

def Ip138_Region(ip:str, User_Agent:str):
    import re
    import requests

    def get_ip138html(ip:str, User_Agent:str):
        # 加入Useer-Agent否则无法获取响应，这里产生随机UserAgent，防止基于User-Agent的反爬
        # User_Agent = UserAgent().random
        headers = {
            'User-Agent': User_Agent
        }
        url = 'https://www.ip138.com/iplookup.asp?ip=' + ip + '&action=2'
        # 编码解码的方式防止乱码
        html = requests.post(url, headers=headers).text.encode('raw_unicode_escape').decode('gbk')
        return html

    def dig_ip138_information(html):
        # 获得ip段
        rule1 = re.compile(r'"iP段":"(.*)", "兼容')
        # 观察响应发现其他信息都储存在一个字典中，利用正则获取字典
        rule2 = re.compile(r'"ip_c_list":\[(.*)], "zg"')
        # 从html源码中正则获取信息
        # result1为ip的网段，result2为其他信息
        result1 = rule1.search(html).group(1)
        result2 = rule2.search(html).group(1)
        # 将获取到的字典字符串转换为python字典
        ip_information_dict = eval(result2)
        # 由于已经获取到网段，且经测试idc均无返回值，删除这三对键值
        ip_information_dict.pop('begin')
        ip_information_dict.pop('end')
        ip_information_dict.pop('idc')
        # 增加网段的键值对
        ip_information_dict['segment'] = result1
        # 将国家省城市键合并为place字符串
        print(ip_information_dict)
        return ip_information_dict['ct'] + ip_information_dict['prov'] + ip_information_dict['city'] +  ip_information_dict['area']

    def mian(ip:str, User_Agent:str):
        # 获得ip138的页面
        ip138_html = get_ip138html(ip, User_Agent)
        print(dig_ip138_information(ip138_html))
        # 爬取信息，并返回一个字典
        return dig_ip138_information(ip138_html)
    return mian(ip, User_Agent)








